#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include "pagina.h"

void montaListaPrincipal (ListaPrincipal **lista, int tamanho)
{
	int i;
	ListaPrincipal *aux1, *aux2;
	
	*lista = (ListaPrincipal*)malloc(sizeof(ListaPrincipal));
	(*lista)->indice = 0;
	(*lista)->prox = NULL;
	(*lista)->viz = NULL;
	
	aux1 = (*lista);
	
	for(i=1; i<tamanho; i++)
	{
		aux2 = (ListaPrincipal*)malloc(sizeof(ListaPrincipal));
		aux2->indice = i;
		aux2->prox = NULL;
		aux2->viz = NULL;
		
		aux1->prox = aux2;
		aux1 = aux1->prox;
	}
}

/* monta uma lista com o nome do site e seu correspondente indice do parametro - os nomes dos sites sao ordenados pela tabela ascii
   o que facilita na procura do indice pelo site na funcao de achar o menor caminho - lista ordenada do maior para o menor */
void insereCorresponde (ListaCorresponde **lista, char *site, int ind)
{
	ListaCorresponde *aux, *novo;
	
	if(*lista == NULL) /* primeiro a ser inserido, pois a lista esta vazia */
	{
		(*lista) = (ListaCorresponde*)malloc(sizeof(ListaCorresponde));
		strcpy((*lista)->site, site);
		(*lista)->indice = ind;
		(*lista)->prox = NULL;
	}
	
	else /* jah ha elementos na lista, deve-se procurar a posicao correta a inserir */
	{
		aux = *lista;
		
		if( strcmp(aux->site, site) < 0) /* inserir no comeco, pois o a ser inserido eh maior */
		{
			novo = (ListaCorresponde*)malloc(sizeof(ListaCorresponde));
			strcpy(novo->site, site);
			novo->indice = ind;
			novo->prox = aux;
		}
		
		else /* nao eh maior que o primeiro, procura posicao correta a inserir */
		{
			novo = (ListaCorresponde*)malloc(sizeof(ListaCorresponde));
			strcpy(novo->site, site);
			novo->indice = ind;
			
			while (aux->prox != NULL && (strcmp(aux->prox->site,site) > 0) )
				aux = aux->prox;
			
			/* a posicao correta eh apos aux */
			if(aux->prox == NULL) /* inserir no final */
			{
				aux->prox = novo;
				novo->prox = NULL;
			}
			
			else /* inserir entre dois elementos */
			{
				novo->prox = aux->prox;
				aux->prox = novo;
			}
		}
	}
}

void insereVizinho (ListaPrincipal **lista, int numVizinho)
{
	ListaVizinho *aux, *novo;
	
	novo = (ListaVizinho*)malloc(sizeof(ListaVizinho));
	novo->indice = numVizinho;
	novo->prox = NULL;
	
	if((*lista)->viz == NULL) /* ainda nao ha vizinhos, primeiro a ser inserido */	
		(*lista)->viz = novo;
	
	else /* inserir no final */
	{
		aux = (*lista)->viz;
		
		/* aux apontara para o ultimo e deve-se inserir depois de aux */
		while(aux->prox != NULL)
			aux = aux->prox;
		
		aux->prox = novo;
		
	}
}

/* retorna o inteiro do indice correspondente ao site passado como parametro - recebe a listaCorresponde montada acima como parametro */
int corresponde (ListaCorresponde **lista, char site)
{
	/* vou fazer essa funcao depois, mas ela eh bem simples:
	
	algoritmo:
	
	percorre a lista ateh encontrar o site e parar caso o site procurado for menor - como a lista esta ordenada
	do maior para o menor, se encontrar um menor e nao tiver achado, esse site procurado nao existe - com ctz tem isso nos 
		testes fechados...*/
}

void liberaListaP (ListaPrincipal **lista)
{
	ListaVizinho *auxViz1, *auxViz2;
	ListaPrincipal *aux;
	
	if(*lista == NULL) return;
	
	else
	{
		while(*lista != NULL)
		{
		
			if((*lista)->viz == NULL)
			{
				aux = *lista;
				*lista = (*lista)->prox;
				free(aux);
			}
			
			else /* tem lista de vizinhos a ser liberada */
			{
				auxViz1 = (*lista)->viz;
				
				while(auxViz1 != NULL)
				{
					auxViz2 = auxViz1;
					auxViz1 = auxViz1->prox;
					free(auxViz2);
				}
				
				*lista = (*lista)->prox;
			}
		}
	}
}

void liberaListaC (ListaCorresponde **lista)
{
	ListaCorresponde *aux;

	aux = *lista;

	while (aux != NULL)
	{
		*lista = aux->prox;
		free(aux);
		aux = NULL;
		aux = *lista;
	}
}

/* funcoes testes de impressao */
void imprime(ListaPrincipal **lista)
{
	ListaPrincipal *aux;
	ListaVizinho *auxViz;
	
	if(*lista == NULL) 
	{
		printf("Lista Vazia\n");
		return;
	}
	
	else
	{
		aux = *lista;
		
		while(aux != NULL)
		{
			printf("Principal: %d \n", aux->indice);
			
			printf("Vizinhos : ");
			
			auxViz = aux->viz;
			
			if(auxViz == NULL) printf("Nao ha vizinhos para %d \n", aux->indice);
			
			else
			{
				while(auxViz != NULL)
				{
					printf("%d ", auxViz->indice);
					auxViz = auxViz->prox;
				}
				
				printf("\n");
			}
			
			aux = aux->prox;
		}
		
	}
}